import { defineStore } from 'pinia'
import type { ThemeColorOption, ThemeMode, ThemeState } from '@/composables/types/theme'
import { themeColorOptions } from '@/composables/types/theme'

// 本地存储的key
const THEME_STORAGE_KEY = 'manual-theme-settings'

// 从本地存储获取主题设置
function getStoredThemeSettings() {
  try {
    const stored = uni.getStorageSync(THEME_STORAGE_KEY)
    if (stored) {
      return JSON.parse(stored)
    }
  } catch (error) {
    console.warn('读取主题设置失败:', error)
  }
  return null
}

// 保存主题设置到本地存储
function saveThemeSettings(settings: Partial<ThemeState>) {
  try {
    uni.setStorageSync(THEME_STORAGE_KEY, JSON.stringify(settings))
  } catch (error) {
    console.warn('保存主题设置失败:', error)
  }
}

// 生成完整的主题变量
function generateThemeVars(themeColor: ThemeColorOption) {
  return {
    // 暗黑模式相关变量
    darkBackground: '#0f0f0f',
    darkBackground2: '#1a1a1a',
    darkBackground3: '#242424',
    darkBackground4: '#2f2f2f',
    darkBackground5: '#3d3d3d',
    darkBackground6: '#4a4a4a',
    darkBackground7: '#606060',
    darkColor: '#ffffff',
    darkColor2: '#e0e0e0',
    darkColor3: '#a0a0a0',
    
    // 主题色相关变量
    colorTheme: themeColor.primary,
    
    // 按钮组件主题色
    buttonPrimaryBg: themeColor.primary,
    buttonPrimaryBorder: themeColor.primary,
    
    // 标签页组件主题色
    tabsLineColor: themeColor.primary,
    tabsActiveColor: themeColor.primary,
    
    // 开关组件主题色
    switchOnBg: themeColor.primary,
    
    // 复选框组件主题色
    checkboxCheckedBg: themeColor.primary,
    checkboxCheckedBorder: themeColor.primary,
    
    // 单选框组件主题色
    radioCheckedBg: themeColor.primary,
    
    // 进度条组件主题色
    progressColor: themeColor.primary,
    
    // 滑块组件主题色
    sliderActiveColor: themeColor.primary,
    sliderButtonBg: themeColor.primary,
    
    // 标签组件主题色
    tagPrimaryBg: themeColor.primary,
    tagPrimaryBorder: themeColor.primary,
    
    // 徽标组件主题色
    badgeBg: themeColor.primary,
    
    // 分步器组件主题色
    stepsActiveColor: themeColor.primary,
    stepsFinishColor: themeColor.primary,
    
    // 底部导航主题色
    tabbarItemActiveColor: themeColor.primary,
  }
}

/**
 * 完整版主题状态管理
 * 支持手动切换主题、主题色选择、跟随系统主题等完整功能
 */
export const useManualThemeStore = defineStore('manualTheme', {
  state: (): ThemeState => {
    // 尝试从本地存储恢复设置
    const stored = getStoredThemeSettings()
    const defaultThemeColor = themeColorOptions[0]
    
    return {
      theme: stored?.theme || 'light',
      followSystem: stored?.followSystem !== undefined ? stored.followSystem : true,
      hasUserSet: stored?.hasUserSet || false,
      currentThemeColor: stored?.currentThemeColor || defaultThemeColor,
      themeVars: generateThemeVars(stored?.currentThemeColor || defaultThemeColor),
      showThemeColorSheet: false, // 初始化主题色选择器显示状态
    }
  },

  getters: {
    isDark: state => state.theme === 'dark',
  },

  actions: {
    /**
     * 手动切换主题
     * @param mode 指定主题模式，不传则自动切换
     */
    toggleTheme(mode?: ThemeMode) {
      this.theme = mode || (this.theme === 'light' ? 'dark' : 'light')
      this.hasUserSet = true // 标记用户已手动设置
      this.followSystem = false // 不再跟随系统
      this.setNavigationBarColor()
      
      // 保存到本地存储
      this.saveSettings()
    },

    /**
     * 设置是否跟随系统主题
     * @param follow 是否跟随系统
     */
    setFollowSystem(follow: boolean) {
      this.followSystem = follow
      if (follow) {
        this.hasUserSet = false
        this.initTheme() // 重新获取系统主题
      }
      
      // 保存到本地存储
      this.saveSettings()
    },

    /**
     * 设置导航栏颜色
     */
    setNavigationBarColor() {
      uni.setNavigationBarColor({
        frontColor: this.theme === 'light' ? '#000000' : '#ffffff',
        backgroundColor: this.theme === 'light' ? '#ffffff' : '#000000',
      })
    },

    /**
     * 设置主题色
     * @param color 主题色选项
     */
    setCurrentThemeColor(color: ThemeColorOption) {
      this.currentThemeColor = color
      this.themeVars = generateThemeVars(color)
      
      // 保存到本地存储
      this.saveSettings()
      
      console.log('主题色已切换至:', color.name, color.primary)
    },

    /**
     * 获取系统主题
     * @returns 系统主题模式
     */
    getSystemTheme(): ThemeMode {
      try {
        // #ifdef MP-WEIXIN
        // 微信小程序使用 getAppBaseInfo
        const appBaseInfo = uni.getAppBaseInfo()
        if (appBaseInfo && appBaseInfo.theme) {
          return appBaseInfo.theme as ThemeMode
        }
        // #endif

        // #ifndef MP-WEIXIN
        // 其他平台使用 getSystemInfoSync
        const systemInfo = uni.getSystemInfoSync()
        if (systemInfo && systemInfo.theme) {
          return systemInfo.theme as ThemeMode
        }
        // #endif
      }
      catch (error) {
        console.warn('获取系统主题失败:', error)
      }
      return 'light' // 默认返回 light
    },

    /**
     * 初始化主题
     */
    initTheme() {
      // 如果用户已手动设置且不跟随系统，保持当前主题
      if (this.hasUserSet && !this.followSystem) {
        console.log('使用用户设置的主题:', this.theme)
        this.setNavigationBarColor()
        return
      }

      // 获取系统主题
      const systemTheme = this.getSystemTheme()

      // 如果是首次启动或跟随系统，使用系统主题
      if (!this.hasUserSet || this.followSystem) {
        this.theme = systemTheme
        if (!this.hasUserSet) {
          this.followSystem = true
          console.log('首次启动，使用系统主题:', this.theme)
        }
        else {
          console.log('跟随系统主题:', this.theme)
        }
      }

      this.setNavigationBarColor()
      
      // 保存到本地存储
      this.saveSettings()
    },
    
    /**
     * 打开主题色选择器
     */
    openThemeColorPicker() {
      this.showThemeColorSheet = true
      
      // 保存到本地存储
      this.saveSettings()
    },
    
    /**
     * 关闭主题色选择器
     */
    closeThemeColorPicker() {
      this.showThemeColorSheet = false
      
      // 保存到本地存储
      this.saveSettings()
    },
    
    /**
     * 保存设置到本地存储
     */
    saveSettings() {
      const settings = {
        theme: this.theme,
        followSystem: this.followSystem,
        hasUserSet: this.hasUserSet,
        currentThemeColor: this.currentThemeColor,
        showThemeColorSheet: this.showThemeColorSheet, // 保存主题色选择器状态
      }
      saveThemeSettings(settings)
    },
  },
})
